/* Universidad del Valle de Guatemala
 * CC2003 - Algoritmos y Estructuras de Datos
 * PROYECTO #3: PI-LISP
 * Fecha de Entrega: Lunes 21 de Noviembre de 2011
 */

/**
 * Clase que representa a la interface de usuario.
 * @authors José Antonio Bagur - 10275, Emilio José Miranda - 10411, Luis Antonio Siguenza - 10297
 */

/* SE IMPORTAN LOS PAQUETES UTILIZADOS EN LA CLASE */
import java.util.*;

public class Main {

    // MOSTRAR MENSAJE INICIAL
    public static void mensaje() {
        System.out.println("              3.141592653589793238462643383279                                                         "
                + "\n             5028841971693993751058209749445923                                                              "
                + "\n            07816406286208998628034825342117067                                                              "
                + "\n            9821    48086         5132                                                                       "
                + "\n           823      06647        09384                                                                       "
                + "\n          46        09550        58223                                                                       "
                + "\n          17        25359        4081                                                                        "
                + "\n                    2848         1117                                                                        "
                + "\n                    4502         8410                                                                        "
                + "\n                    2701         9385                                                                        "
                + "\n                   21105        55964              TTTT              TTTTT      TTTTTTTT      TTTTTTTTTTT    "
                + "\n                   46229        48954             TTTTTT            TTTTTTT    TTTTTTTTTT    TTTTTTTTTTTTTT  "
                + "\n                   9303         81964             TTTTTT            TTTTTTT   TTTTTTTTTTTT   TTTTT     TTTTT "
                + "\n                   4288         10975             TTTTTT            TTTTTTT   TTTTTT         TTTTT     TTTTT "
                + "\n                  66593         34461             TTTTTT            TTTTTTT   TTTTTT         TTTTT     TTTTT "
                + "\n                 284756         48233             TTTTTT            TTTTTTT    TTTTT         TTTTTTTTTTTTTT  "
                + "\n                 78678          31652        71   TTTTTT            TTTTTTT         TTTTT    TTTTTTTTTTTTT   "
                + "\n                2019091         456485       66   TTTTTT            TTTTTTT         TTTTTT   TTTTTT          "
                + "\n               9234603           48610454326648   TTTTTT            TTTTTTT         TTTTTT   TTTTTT          "
                + "\n              2133936            0726024914127    TTTTTTTTTTTTTT    TTTTTTT   TTTTTTTTTTTT   TTTTTT          " 
                + "\n              3724587             00660631558      TTTTTTTTTTTTTT   TTTTTTT    TTTTTTTTTT    TTTTTT          "
                + "\n              817488               152092096        TTTTTTTTTTTTT    TTTTT      TTTTTTTT      TTTTT          "
                + "\n                                                                                                             "
                + "\n                                                                                                             "
                + "\n     Bienvenido a PI-LISP 0.0000.3.146 (21 - 11 - 2011) <https://interprete-lisp-uvg.googlecode.com/svn/trunk/> "
                + "\n                 Copyright UVG (C) José Antonio Bagur, Emilio José Miranda, y Luis Antonio Sigüenza          "
                + "\n                                       ¿Necesita ayuda? Ingrese (help)"
                + "\n");
    }
    
    // MOSTRAR MENSAJE DE AYUDA
    public static void help() {
        System.out.println("-----> AYUDA: PI-LISP permite realizar operaciones aritmeticas y definicion de funciones");
        System.out.println("              con la sintaxis de CLISP. "
                         + "\n              Por ejemplo: (+ 2 3), (+ 2 (* 2 2)) o (defun far2cel (fahr) (* (- fahr 32) (/ 5.0 9.0)))");
    }
    
    // REVISA SI LA CANTIDAD DE PARÉNTESIS ES CORRECTA
    public static boolean cantParentesis(char buscar1, char buscar2, String cadena) {
        int cant1 = 0;
        int cant2 = 0;
        
        for (int i = 0; i < cadena.length(); i++) {
            if (cadena.charAt(i) == buscar1) {
                cant1++;
            }
            else if (cadena.charAt(i) == buscar2) {
                cant2++;
            }
        }

        return (cant1==cant2);
    }
    
    // LECTURA DE COMANDO INGRESADO
    public static String leer(Scanner in, int num) {
        String comando = "";
        boolean terminar = false;
        boolean sintax = false;     // PARENTESIS ABIERTOS

        do {
            System.out.print("[" + num + "]> ");            
            comando += " " + in.nextLine();            

            sintax = cantParentesis('(', ')', comando);
            if (sintax) {
                terminar = true;
            } else {
                System.out.println("-----> ERROR: FALTAN PARENTESIS");
                comando = "";
            }
            
            num++;
        } while (!terminar);
        
        return comando;
    }
    
    public static void main(String[] args) throws Exception {
        
        // DECLARACIÓN DE OBJETOS 
        Scanner in = new Scanner(System.in);
        
        // DECLARACIÓN DE VARIABLES
        boolean terminar = false;
        int num = 1;
        
        mensaje();
        
        while (!terminar) {
            String comando = leer(in, num).trim();
            num++;

            if (comando.equalsIgnoreCase("(exit)")) {
                terminar = true;
                System.out.print("\n");
                System.out.println("-----> GRACIAS POR UTILIZAR PI-LISP");
                System.out.println("-----> 3.14159265358979323846264...");
                break;
            }

            if (comando.equalsIgnoreCase("(help)")) {
                help();
            } else {
                Atom atomoAEvaluar = Lisp.parseExpression(comando, false, false);
                System.out.println(Lisp.evaluateExp(atomoAEvaluar).toString());
            }     
        }
    }
    
}   // FIN DEL MAIN